home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / djgpp / src / gdb-4.12 / gdb / cp-valpr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-03  |  13.2 KB  |  493 lines

  1. /* Support for printing C++ values for GDB, the GNU debugger.
  2.    Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
  3.  
  4. This file is part of GDB.
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "defs.h"
  21. #include "obstack.h"
  22. #include "symtab.h"
  23. #include "gdbtypes.h"
  24. #include "expression.h"
  25. #include "value.h"
  26. #include "command.h"
  27. #include "gdbcmd.h"
  28. #include "demangle.h"
  29.  
  30. int vtblprint;            /* Controls printing of vtbl's */
  31. int objectprint;        /* Controls looking up an object's derived type
  32.                    using what we find in its vtables.  */
  33. struct obstack dont_print_obstack;
  34.  
  35. static void
  36. cplus_print_value PARAMS ((struct type *, char *, GDB_FILE *, int, int,
  37.                enum val_prettyprint, struct type **));
  38.  
  39. /* BEGIN-FIXME:  Hooks into typeprint.c, find a better home for prototypes. */
  40.  
  41. extern void
  42. c_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int));
  43.  
  44. extern void
  45. c_type_print_varspec_prefix PARAMS ((struct type *, GDB_FILE *, int, int));
  46.  
  47. extern void
  48. cp_type_print_method_args PARAMS ((struct type **, char *, char *, int,
  49.                    GDB_FILE *));
  50.  
  51. extern struct obstack dont_print_obstack;
  52.  
  53. /* END-FIXME */
  54.  
  55. void
  56. cp_print_class_method (valaddr, type, stream)
  57.      char *valaddr;
  58.      struct type *type;
  59.      GDB_FILE *stream;
  60. {
  61.   struct type *domain;
  62.   struct fn_field *f = NULL;
  63.   int j = 0;
  64.   int len2;
  65.   int offset;
  66.   char *kind = "";
  67.   CORE_ADDR addr;
  68.   struct symbol *sym;
  69.   unsigned len;
  70.   unsigned int i;
  71.  
  72.   check_stub_type (TYPE_TARGET_TYPE (type));
  73.   domain = TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type));
  74.   if (domain == (struct type *)NULL)
  75.     {
  76.       fprintf_filtered (stream, "<unknown>");
  77.       return;
  78.     }
  79.   addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
  80.   if (METHOD_PTR_IS_VIRTUAL (addr))
  81.     {
  82.       offset = METHOD_PTR_TO_VOFFSET (addr);
  83.       len = TYPE_NFN_FIELDS (domain);
  84.       for (i = 0; i < len; i++)
  85.     {
  86.       f = TYPE_FN_FIELDLIST1 (domain, i);
  87.       len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
  88.       
  89.       for (j = 0; j < len2; j++)
  90.         {
  91.           QUIT;
  92.           if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
  93.         {
  94.           kind = "virtual ";
  95.           goto common;
  96.         }
  97.         }
  98.     }
  99.     }
  100.   else
  101.     {
  102.       sym = find_pc_function (addr);
  103.       if (sym == 0)
  104.     {
  105.       error ("invalid pointer to member function");
  106.     }
  107.       len = TYPE_NFN_FIELDS (domain);
  108.       for (i = 0; i < len; i++)
  109.     {
  110.       f = TYPE_FN_FIELDLIST1 (domain, i);
  111.       len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
  112.       
  113.       for (j = 0; j < len2; j++)
  114.         {
  115.           QUIT;
  116.           if (TYPE_FN_FIELD_STUB (f, j))
  117.         check_stub_method (domain, i, j);
  118.           if (STREQ (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
  119.         {
  120.           goto common;
  121.         }
  122.         }
  123.     }
  124.     }
  125.   common:
  126.   if (i < len)
  127.     {
  128.       fprintf_filtered (stream, "&");
  129.       c_type_print_varspec_prefix (TYPE_FN_FIELD_TYPE (f, j), stream, 0, 0);
  130.       fprintf_unfiltered (stream, kind);
  131.       if (TYPE_FN_FIELD_PHYSNAME (f, j)[0] == '_'
  132.       && TYPE_FN_FIELD_PHYSNAME (f, j)[1] == CPLUS_MARKER)
  133.     {
  134.       cp_type_print_method_args (TYPE_FN_FIELD_ARGS (f, j) + 1, "~",
  135.                      TYPE_FN_FIELDLIST_NAME (domain, i),
  136.                      0, stream);
  137.     }
  138.       else
  139.     {
  140.       cp_type_print_method_args (TYPE_FN_FIELD_ARGS (f, j), "",
  141.                      TYPE_FN_FIELDLIST_NAME (domain, i),
  142.                      0, stream);
  143.     }
  144.     }
  145.   else
  146.     {
  147.       fprintf_filtered (stream, "(");
  148.       type_print (type, "", stream, -1);
  149.       fprintf_filtered (stream, ") %d", (int) addr >> 3);
  150.     }
  151. }
  152.  
  153. /* Return truth value for assertion that TYPE is of the type
  154.    "pointer to virtual function".  */
  155.  
  156. int
  157. cp_is_vtbl_ptr_type(type)
  158.      struct type *type;
  159. {
  160.   char *typename = type_name_no_tag (type);
  161.   /* This was what it was for gcc 2.4.5 and earlier.  */
  162.   static const char vtbl_ptr_name_old[] =
  163.     { CPLUS_MARKER,'v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
  164.   /* It was changed to this after 2.4.5.  */
  165.   static const char vtbl_ptr_name[] =
  166.     { '_','_','v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
  167.  
  168.   return (typename != NULL
  169.       && (STREQ (typename, vtbl_ptr_name)
  170.           || STREQ (typename, vtbl_ptr_name_old)));
  171. }
  172.  
  173. /* Return truth value for the assertion that TYPE is of the type
  174.    "pointer to virtual function table".  */
  175.  
  176. int
  177. cp_is_vtbl_member(type)
  178.      struct type *type;
  179. {
  180.   if (TYPE_CODE (type) == TYPE_CODE_PTR)
  181.     type = TYPE_TARGET_TYPE (type);
  182.   else
  183.     return 0;
  184.  
  185.   if (TYPE_CODE (type) == TYPE_CODE_ARRAY
  186.       && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT)
  187.     /* Virtual functions tables are full of pointers to virtual functions.  */
  188.     return cp_is_vtbl_ptr_type (TYPE_TARGET_TYPE (type));
  189.   return 0;
  190. }
  191.  
  192. /* Mutually recursive subroutines of cplus_print_value and c_val_print to
  193.    print out a structure's fields: cp_print_value_fields and cplus_print_value.
  194.  
  195.    TYPE, VALADDR, STREAM, RECURSE, and PRETTY have the
  196.    same meanings as in cplus_print_value and c_val_print.
  197.  
  198.    DONT_PRINT is an array of baseclass types that we
  199.    should not print, or zero if called from top level.  */
  200.  
  201. void
  202. cp_print_value_fields (type, valaddr, stream, format, recurse, pretty,
  203.                dont_print)
  204.      struct type *type;
  205.      char *valaddr;
  206.      GDB_FILE *stream;
  207.      int format;
  208.      int recurse;
  209.      enum val_prettyprint pretty;
  210.      struct type **dont_print;
  211. {
  212.   int i, len, n_baseclasses;
  213.  
  214.   check_stub_type (type);
  215.  
  216.   fprintf_filtered (stream, "{");
  217.   len = TYPE_NFIELDS (type);
  218.   n_baseclasses = TYPE_N_BASECLASSES (type);
  219.  
  220.   /* Print out baseclasses such that we don't print
  221.      duplicates of virtual baseclasses.  */
  222.   if (n_baseclasses > 0)
  223.     cplus_print_value (type, valaddr, stream, format, recurse+1, pretty,
  224.                dont_print);
  225.  
  226.   if (!len && n_baseclasses == 1)
  227.     fprintf_filtered (stream, "<No data fields>");
  228.   else
  229.     {
  230.       extern int inspect_it;
  231.       int fields_seen = 0;
  232.  
  233.       for (i = n_baseclasses; i < len; i++)
  234.     {
  235.       /* Check if static field */
  236.       if (TYPE_FIELD_STATIC (type, i))
  237.         continue;
  238.       if (fields_seen)
  239.         fprintf_filtered (stream, ", ");
  240.       else if (n_baseclasses > 0)
  241.         {
  242.           if (pretty)
  243.         {
  244.           fprintf_filtered (stream, "\n");
  245.           print_spaces_filtered (2 + 2 * recurse, stream);
  246.           fputs_filtered ("members of ", stream);
  247.           fputs_filtered (type_name_no_tag (type), stream);
  248.           fputs_filtered (": ", stream);
  249.         }
  250.         }
  251.       fields_seen = 1;
  252.  
  253.       if (pretty)
  254.         {
  255.           fprintf_filtered (stream, "\n");
  256.           print_spaces_filtered (2 + 2 * recurse, stream);
  257.         }
  258.       else 
  259.         {
  260.           wrap_here (n_spaces (2 + 2 * recurse));
  261.         }
  262.       if (inspect_it)
  263.         {
  264.           if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
  265.         fputs_filtered ("\"( ptr \"", stream);
  266.           else
  267.         fputs_filtered ("\"( nodef \"", stream);
  268.           fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
  269.                        language_cplus,
  270.                        DMGL_PARAMS | DMGL_ANSI);
  271.           fputs_filtered ("\" \"", stream);
  272.           fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
  273.                        language_cplus,
  274.                        DMGL_PARAMS | DMGL_ANSI);
  275.           fputs_filtered ("\") \"", stream);
  276.         }
  277.       else
  278.         {
  279.           fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
  280.                        language_cplus,
  281.                        DMGL_PARAMS | DMGL_ANSI);
  282.           fputs_filtered (" = ", stream);
  283.         }
  284.       if (TYPE_FIELD_PACKED (type, i))
  285.         {
  286.           value v;
  287.  
  288.           /* Bitfields require special handling, especially due to byte
  289.          order problems.  */
  290.           if (TYPE_FIELD_IGNORE (type, i))
  291.         {
  292.            fputs_filtered ("<optimized out or zero length>", stream);
  293.         }
  294.           else
  295.         {
  296.                v = value_from_longest (TYPE_FIELD_TYPE (type, i),
  297.                    unpack_field_as_long (type, valaddr, i));
  298.  
  299.                    val_print (TYPE_FIELD_TYPE(type, i), VALUE_CONTENTS (v), 0,
  300.                   stream, format, 0, recurse + 1, pretty);
  301.         }
  302.         }
  303.       else
  304.         {
  305.           if (TYPE_FIELD_IGNORE (type, i))
  306.         {
  307.            fputs_filtered ("<optimized out or zero length>", stream);
  308.         }
  309.           else
  310.         {
  311.                val_print (TYPE_FIELD_TYPE (type, i), 
  312.                   valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
  313.                   0, stream, format, 0, recurse + 1, pretty);
  314.         }
  315.         }
  316.     }
  317.       if (pretty)
  318.     {
  319.       fprintf_filtered (stream, "\n");
  320.       print_spaces_filtered (2 * recurse, stream);
  321.     }
  322.     }
  323.   fprintf_filtered (stream, "}");
  324. }
  325.  
  326. /* Special val_print routine to avoid printing multiple copies of virtual
  327.    baseclasses.  */
  328.  
  329. static void
  330. cplus_print_value (type, valaddr, stream, format, recurse, pretty, dont_print)
  331.      struct type *type;
  332.      char *valaddr;
  333.      GDB_FILE *stream;
  334.      int format;
  335.      int recurse;
  336.      enum val_prettyprint pretty;
  337.      struct type **dont_print;
  338. {
  339.   struct obstack tmp_obstack;
  340.   struct type **last_dont_print
  341.     = (struct type **)obstack_next_free (&dont_print_obstack);
  342.   int i, n_baseclasses = TYPE_N_BASECLASSES (type);
  343.  
  344.   if (dont_print == 0)
  345.     {
  346.       /* If we're at top level, carve out a completely fresh
  347.      chunk of the obstack and use that until this particular
  348.      invocation returns.  */
  349.       tmp_obstack = dont_print_obstack;
  350.       /* Bump up the high-water mark.  Now alpha is omega.  */
  351.       obstack_finish (&dont_print_obstack);
  352.     }
  353.  
  354.   for (i = 0; i < n_baseclasses; i++)
  355.     {
  356.       char *baddr;
  357.       int err;
  358.       char *basename;
  359.  
  360.       check_stub_type (TYPE_BASECLASS (type, i));
  361.       basename = TYPE_NAME (TYPE_BASECLASS (type, i));
  362.  
  363.       if (BASETYPE_VIA_VIRTUAL (type, i))
  364.     {
  365.       struct type **first_dont_print
  366.         = (struct type **)obstack_base (&dont_print_obstack);
  367.  
  368.       int j = (struct type **)obstack_next_free (&dont_print_obstack)
  369.         - first_dont_print;
  370.  
  371.       while (--j >= 0)
  372.         if (TYPE_BASECLASS (type, i) == first_dont_print[j])
  373.           goto flush_it;
  374.  
  375.       obstack_ptr_grow (&dont_print_obstack, TYPE_BASECLASS (type, i));
  376.     }
  377.  
  378.       /* Fix to use baseclass_offset instead. FIXME */
  379.       baddr = baseclass_addr (type, i, valaddr, 0, &err);
  380.       if (err == 0 && baddr == 0)
  381.     error ("could not find virtual baseclass %s\n",
  382.            basename ? basename : "");
  383.  
  384.       if (pretty)
  385.     {
  386.       fprintf_filtered (stream, "\n");
  387.       print_spaces_filtered (2 * recurse, stream);
  388.     }
  389.       fputs_filtered ("<", stream);
  390.       /* Not sure what the best notation is in the case where there is no
  391.      baseclass name.  */
  392.       fputs_filtered (basename ? basename : "", stream);
  393.       fputs_filtered ("> = ", stream);
  394.       if (err != 0)
  395.     fprintf_filtered (stream,
  396.               "<invalid address 0x%lx>", (unsigned long) baddr);
  397.       else
  398.     cp_print_value_fields (TYPE_BASECLASS (type, i), baddr, stream, format,
  399.                    recurse, pretty,
  400.                    (struct type **) obstack_base (&dont_print_obstack));
  401.       fputs_filtered (", ", stream);
  402.  
  403.     flush_it:
  404.       ;
  405.     }
  406.  
  407.   if (dont_print == 0)
  408.     {
  409.       /* Free the space used to deal with the printing
  410.      of this type from top level.  */
  411.       obstack_free (&dont_print_obstack, last_dont_print);
  412.       /* Reset watermark so that we can continue protecting
  413.      ourselves from whatever we were protecting ourselves.  */
  414.       dont_print_obstack = tmp_obstack;
  415.     }
  416. }
  417.  
  418. void
  419. cp_print_class_member (valaddr, domain, stream, prefix)
  420.      char *valaddr;
  421.      struct type *domain;
  422.      GDB_FILE *stream;
  423.      char *prefix;
  424. {
  425.   
  426.   /* VAL is a byte offset into the structure type DOMAIN.
  427.      Find the name of the field for that offset and
  428.      print it.  */
  429.   int extra = 0;
  430.   int bits = 0;
  431.   register unsigned int i;
  432.   unsigned len = TYPE_NFIELDS (domain);
  433.   /* @@ Make VAL into bit offset */
  434.   LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
  435.   for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
  436.     {
  437.       int bitpos = TYPE_FIELD_BITPOS (domain, i);
  438.       QUIT;
  439.       if (val == bitpos)
  440.     break;
  441.       if (val < bitpos && i != 0)
  442.     {
  443.       /* Somehow pointing into a field.  */
  444.       i -= 1;
  445.       extra = (val - TYPE_FIELD_BITPOS (domain, i));
  446.       if (extra & 0x7)
  447.         bits = 1;
  448.       else
  449.         extra >>= 3;
  450.       break;
  451.     }
  452.     }
  453.   if (i < len)
  454.     {
  455.       char *name;
  456.       fprintf_filtered (stream, prefix);
  457.       name = type_name_no_tag (domain);
  458.       if (name)
  459.         fputs_filtered (name, stream);
  460.       else
  461.     c_type_print_base (domain, stream, 0, 0);
  462.       fprintf_filtered (stream, "::");
  463.       fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
  464.       if (extra)
  465.     fprintf_filtered (stream, " + %d bytes", extra);
  466.       if (bits)
  467.     fprintf_filtered (stream, " (offset in bits)");
  468.     }
  469.   else
  470.     fprintf_filtered (stream, "%d", val >> 3);
  471. }
  472.  
  473. void
  474. _initialize_cp_valprint ()
  475. {
  476.   add_show_from_set
  477.     (add_set_cmd ("vtbl", class_support, var_boolean, (char *)&vtblprint,
  478.           "Set printing of C++ virtual function tables.",
  479.           &setprintlist),
  480.      &showprintlist);
  481.  
  482.   add_show_from_set
  483.     (add_set_cmd ("object", class_support, var_boolean, (char *)&objectprint,
  484.       "Set printing of object's derived type based on vtable info.",
  485.           &setprintlist),
  486.      &showprintlist);
  487.  
  488.   /* Give people the defaults which they are used to.  */
  489.   objectprint = 0;
  490.   vtblprint = 0;
  491.   obstack_begin (&dont_print_obstack, 32 * sizeof (struct type *));
  492. }
  493.